﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using InterfazGrafico.LibreriaClases.Clases;
using InterfazGrafico.LibreriaConstantes;
using InterfazGrafico.LibreriaConstantes.Elementos;

namespace InterfazGrafico.LibreriaClases.Propiedades
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PSeleccionarDatos : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDatos.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.Entrada, value);
            }
        }

        /// <summary>
        /// Estructura de entrada y de salida.
        /// </summary>
        public string Estructura
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDatos.Estructura);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.Estructura, value);
            }
        }

        /// <summary>
        /// Lista de salidas de datos.
        /// </summary>
        public List<string> ListaSalidas
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDatos.Salidas);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.Salidas, value);
            }
        }

        /// <summary>
        /// Lista de criterios de selección de datos.
        /// </summary>
        public List<string> ListaCriteriosSeleccion
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDatos.CriteriosSeleccion);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.CriteriosSeleccion, value);
            }
        }

        /// <summary>
        /// Lista de criterios para el ordenado de datos.
        /// </summary>
        public List<string> ListaCriteriosOrden
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDatos.CriteriosOrden);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.CriteriosOrden, value);
            }
        }



        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PSeleccionarDatos()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            try
            {
                base.leer(fichero);
                XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);

                try
                { this.Entrada = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaEntrada); }
                catch (Exception)
                { this.Entrada = string.Empty; };

                try
                { this.Estructura = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaEstructura); }
                catch (Exception)
                { this.Estructura = string.Empty; }

                // Salidas
                try
                {
                    int numeroSalidas = LeerXml.ObtenerNumeroNodosCampo(xml, CSeleccionarDatos.RutaSalidas);
                    for (int indiceSalida = 0; indiceSalida < numeroSalidas; indiceSalida++)
                    {
                        string salida = string.Empty;
                        try
                        { salida = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaSalidas, indiceSalida, Constantes.NodoXMLActual + CSeleccionarDatos.NodoSalidaSalida); }
                        catch (Exception)
                        { continue; }
                        if (!string.Empty.Equals(salida))
                        {
                            this.ListaSalidas.Add(salida);

                            // Criterios seleccion
                            string criterioS = string.Empty;
                            try
                            { criterioS = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaSalidas, indiceSalida, Constantes.NodoXMLActual + CSeleccionarDatos.NodoSalidaCriterio); }
                            catch (Exception)
                            { criterioS = string.Empty; }
                            this.ListaCriteriosSeleccion.Add(criterioS);

                            // Criterios orden
                            string criterioO = string.Empty;
                            try
                            { criterioO = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaSalidas, indiceSalida, Constantes.NodoXMLActual + CSeleccionarDatos.NodoSalidaOrden); }
                            catch (Exception)
                            { criterioO = string.Empty; }
                            this.ListaCriteriosOrden.Add(criterioO);
                        }
                    }
                }
                catch (Exception)
                { 
                    this.ListaSalidas = new List<string>();
                    this.ListaCriteriosSeleccion = new List<string>();
                    this.ListaCriteriosOrden = new List<string>();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_LECTURA_FICHERO_CONFIGURACION, ex);
            }
        }

        /// <summary>
        /// Escribe los parámetros al fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        public override void escribir(string fichero)
        {
            try
            {
                base.escribir(fichero);
                XmlWriter xml = EscribirXml.AbrirFicheroParametros(fichero);
                EscribirXml.InicioElemento(xml, CSeleccionarDatos.NodoRaiz);
                EscribirXml.EscribeNodo(xml, CSeleccionarDatos.NodoEntrada, Entrada);
                EscribirXml.EscribeNodo(xml, CSeleccionarDatos.NodoEstructura, Estructura);

                // Configuracion
                EscribirXml.InicioElemento(xml, CSeleccionarDatos.NodoConfiguracion);
                EscribirXml.InicioElemento(xml, CSeleccionarDatos.NodoSalidas);

                for (int indiceSalida = 0; indiceSalida < ListaSalidas.Count; indiceSalida++)
                {
                    EscribirXml.InicioElemento(xml, CSeleccionarDatos.NodoSalida);
                    EscribirXml.EscribeNodo(xml, CSeleccionarDatos.NodoSalidaSalida, ListaSalidas[indiceSalida]);
                    EscribirXml.EscribeNodo(xml, CSeleccionarDatos.NodoSalidaCriterio, ListaCriteriosSeleccion[indiceSalida]);
                    EscribirXml.EscribeNodo(xml, CSeleccionarDatos.NodoSalidaOrden, ListaCriteriosOrden[indiceSalida]);
                    EscribirXml.FinElemento(xml);
                }

                EscribirXml.FinElemento(xml);
                EscribirXml.FinElemento(xml);
                EscribirXml.FinElemento(xml);
                EscribirXml.Flush(xml);
                EscribirXml.Close(xml);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_ESCRITURA_FICHERO_CONFIGURACION, ex);
            }
        }
    }
}
 